package com.tong.hao.ac.api.feign;

import cn.buddha.jec.util.TongBeanUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName FeignConf
 * @Author 友野浩二
 * @Description feign参数配置
 * @Version 1.0
 *
 * <pre>
 *     将配置文件application.properties中配置的每一个属性值映射到当前类的属性中；
 *     @ConfigurationProperties ：告诉springboot将本类中所有属性和配置文件中相关的配置进行绑定；
 *     prefix="feign"：指出将配置文件中feign下的所有属性进行一一映射；
 *
 *     【注意】：
 *          方式一: 只有当前这个类是容器中的组件时，才可以用容器提供的@ConfigurationProperties功能，所以同时也需要@Component这个注解；
 *          方式二: 在GenericConf类中使用@Configuration和@Bean注解来创建当前类对象。
 * </pre>
 */
@Slf4j
@Data
public class FeignConf {

    /**
     * 用于存储属性名和属性值
     */
    private static Map<String, String> providerMap = new HashMap<>();

    // 1- feign前缀的属性, TODO 暂时没有配置，先不写

    /**
     * <pre>
     *      Q: 现在有这样一个诉求，在当前类中读取不在feign前缀下的属性值
     *      A: 由于类注解@ConfigurationProperties已经指定了prefix前缀，所以这里考虑使用@Value方式进行读取
     * </pre>
     * 应用名,用于服务之间的调用时@FeignClient注解上指定name
     */
    @Value("${spring.application.name}")
    String applicationName;

    /**
     * 应用上下文路径
     */
    @Value("${server.servlet.context-path}")
    String contextPath;

    /**
     * @return void
     * @Author 友野浩二
     * @Description // 初始化方法
     * @Date 2020/5/5 1:02
     * @Param []
     */
    public void init() {
        // 对象转map, 这里使用this，是因为在com.tong.hao.ac.api.configuration.GenericConf类中使用@Bean已经创建了对象
        // key: 属性名称, value: 属性值
        providerMap = TongBeanUtils.object2Map(this);
        log.info("ac providerMap: {}", providerMap);
    }

    /**
     * @return java.lang.String
     * @Author 友野浩二
     * @Description // 根据FeignConf的属性名称获取属性值
     * @Param [key: FeignConf的属性名]
     */
    public static String get(String key) {
        return providerMap.get(key);
    }

}
